/*
 * Database.java
 *
 * Created on 8. duben 2009, 10:54
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 *
 *Struktura DB - tabulka nese dvoup�smenn� ozna�en� jazyka
 *                  ID | jmeno | slozka | kategorie | verze | popis | plna | datum | editoval
 *             - servisní tabulka
 *                  ID | radek | hodnota1 | hodnota2 | hodnota3
 */
package projekt_db_dropbox;

import java.io.*;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import org.sqlite.JDBC;

public class Database {

    public static Connection dbConnection;
    public static Statement dbStatement;

    static ResultSet get_data() {
        ResultSet rs = null;
        try {
            rs = dbStatement.executeQuery("Select jmeno FROM data ORDER BY datum DESC");
        } catch (SQLException e) {
            System.out.println("Nepodarilo ziskat vypis databaze...\n\n" + e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return (null);
        }
        return (rs);
    }

    static ResultSet get_row(String jmeno) {
        ResultSet rs = null;
        try {
            rs = dbStatement.executeQuery("Select * FROM data WHERE jmeno='"+jmeno+"'");
        } catch (SQLException e) {
            System.out.println("Nepodarilo ziskat vypis databaze...\n\n" + e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return (null);
        }
        return (rs);
    }

    static String heslo(String user) {
        ResultSet rs = null;
        String heslo = null;
        try {
            rs = dbStatement.executeQuery("Select hodnota1 from servis_majkee WHERE radek='"+user+"'");
            rs.next();
            heslo = rs.getString("hodnota1");
 //           System.out.print("Spravne heslo - " + heslo);
        } catch (SQLException e) {
            System.out.println("Heslo se nepodarilo ziskat...\n\n" + e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return("neni");
        }
        return(heslo);
    }

    static int pripoj(String cesta) // P�ipoj� aplikaci k datab�zi
    {
        try {
            Class.forName("org.sqlite.JDBC"); // zaveden� ovlada�e datab�ze
            System.out.println("Ovladac inicializovan..\n");
            dbConnection = DriverManager.getConnection("jdbc:sqlite:/" + cesta); // p�ipoj� datab�zov� soubor
            System.out.println("Databaze pripojena.. - " + cesta + "\n");
            dbStatement = dbConnection.createStatement();  // Statement je pot�eba pro prov�d�n� dotaz� 
            System.out.println("Statement inicializovan..\n");
        } catch (ClassNotFoundException ex) // vypisuje chybu, kdy� nenajde ovlada� DB
        {
            System.out.println("Nelze inicializovat ovladac..\n" + ex);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
            return (-1);
        } catch (SQLException ex) // vypisuje chybu, kdy� se nep�ipoj� do DB
        {
            System.out.println("Nelze navazt spojeni s databazi..\n" + ex + "\nSoubor: " + cesta + "\n");
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
            return (-1);
        }
        return (0);
    }


    static boolean test() {
        ResultSet rs = null;
        try {
            rs = dbStatement.executeQuery("Select * from servis_majkee");
        } catch (SQLException e) {
            System.out.println("Bohuzel neni otevrena spravna DB\n" + e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return(false);
        }
        return(true);
    }

    static void update_row(String edit_name, String jmeno, String slozka, String kategorie, int verze, String popis, int plna, String user) {
        try {
            dbStatement.executeUpdate("UPDATE data SET  jmeno='"+jmeno+"', slozka='" + slozka + "', kategorie='" + kategorie + "', verze=" + verze + ", popis='" + popis + "', plna=" + plna + ",datum=date(), editoval='" + user + "' WHERE jmeno='"+edit_name+"'");
        } catch (SQLException ex) {
            Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
        }

    }
    static int zavri() // Ukonci spojeni s databazi
    {
        try {
            dbStatement.close();
            System.out.println("Statement zahozen..");
            dbConnection.close();
            System.out.println("Databaze zavrena..");
        } catch (SQLException e) {
            System.out.println("Pri ukoncovani spojeni se vyskytla chyba.\n"+e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return (-1);
        }
        return (0);
    }

    static void vypis_po_polozkach(ResultSet rs) // Doplnuje SQL dotazovac - ziskava jednotlive polozky, aby bylo mozne selektovet jednotlive polozky
    {

        String result = new String();

        try {
            result = result + rs.getInt(1) + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat ID");
        }

        try {
            result = result + rs.getString(2) + "/";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat slozku");
        }

        try {
            result = result + rs.getString(3) + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat jmeno");
        }

        try {
            result = result + rs.getString(4) + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat kategorii");
        }

        try {
            result = result + rs.getInt("verze") + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat verzi");
        }

        try {
            result = result + rs.getString("popis") + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat popis");
        }

        try {
            result = result + rs.getInt("plna") + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat plna");
        }

        try {
            result = result + rs.getDate("datum") + "\t";
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat datum");
        }

        try {
            result = result + rs.getString("editoval");
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat editoval");
        }

        System.out.println(result);
        SQLWindow.vypis_radek(result);
    }

    static void sql_dotaz(String dotaz) {
        ResultSet rs = null;
        try {
            rs = dbStatement.executeQuery(dotaz);
            System.out.println("Zadan dotaz: " + dotaz);
        } catch (SQLException e) {
            System.out.println("Nepodarilo se získat odpověď");
        }
        try {
            while (rs.next()) {
                vypis_po_polozkach(rs);
            }
        } catch (SQLException ex) {
            System.out.println("Chyba pri ziskavani dat ze ResultSetu\n"+ex);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
        }
    }

    static int vytvor_tab() // vytvori novou tabulku databaze pro aplikace
    {
        try {
            dbStatement.executeUpdate("CREATE TABLE IF NOT EXISTS data(ID Integer Not Null, jmeno VarChar(255) Not Null, slozka VarChar(255) Not Null, kategorie VarChar(255) Not Null, verze Integer Not Null, popis VarChar(700) Not Null, plna Integer Not Null, datum date Not Null, editoval VarChar(255) Not Null, Primary Key (ID))");
        } catch (SQLException e) {
            System.out.println("Nepodarilo se mi vytvorit tabulku!!\n"+e);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
            return (-1);
        }
        return (0);
    }

    static int vytvor_kontrolni_tabulku()
    {
         try {
            dbStatement.executeUpdate("CREATE TABLE IF NOT EXISTS servis_majkee(ID Integer Not Null, radek VarChar(255), hodnota1 VarChar(500), hodnota2 VarChar(500), hodnota3 VarChar(500), Primary Key (ID))");
            System.out.println("Tabulka vytvořena");
        } catch (SQLException e) {
            System.out.println("Nepodarilo se mi vytvorit tabulku!!\n"+e);
            return (-1);
        }
          try {
            dbStatement.executeUpdate("INSERT INTO servis_majkee VALUES(0, 'servis', 'Developed by Michal Zíma', 'implementováno zjišťování nové verze, nastavení', '')");
            System.out.println("DADA ZAPSANA");
        } catch (SQLException ex) {
//            ex.printStackTrace();
            System.out.println("Nepodarilo se zapsat\n"+ex);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
        }
        return (0);
    }
    static void servis(String dotaz) {
        try
        {
            dbStatement.executeUpdate(dotaz);
            System.out.println("Update vykonan");
        }
        catch (SQLException e)
        {
             System.out.println("Nepodarilo provest update\n"+e);
             JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
        }
    }

    static void servis(int ID, String radek, String hodnota1, String hodnota2, String hodnota3){
        try
        {
            dbStatement.executeUpdate("UPDATE servis_majkee SET(radek='"+radek+"', hodnota1='"+hodnota1+"', hodnota2='"+hodnota2+"', hodnota3='"+hodnota3+"' WHERE ID="+ID+")");
            System.out.println("Updatovano: "+radek);
        }
        catch (SQLException e)
        {
             System.out.println("Nepodarilo provest update: " + radek);
             add_servis(ID, radek, hodnota1, hodnota2, hodnota3);
        }
    }
    static void add_servis(int ID, String radek, String hodnota1, String hodnota2, String hodnota3){
        try
        {
         dbStatement.executeUpdate("INSERT INTO servis_majkee VALUES("+ID+",'"+radek+"', '"+hodnota1+"', '"+hodnota2+"', '"+hodnota3+"')");
            System.out.println("Pridan novy radek: "+radek);
        }
        catch (SQLException ex)
        {
             System.out.println("Nepodarilo se pridat radek: " + radek +"\n");
             JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
             System.out.println("\n"+ex);
        }
    }
    static int pridej_polozku(String jmeno, String slozka, String kategorie, int verze, String popis, int plna, String user) {
        int ID = 0; // pokud je tabulka pr�zdn� zapisuje se na ID = 0
        int ID_exist;
        System.out.println("Zapisuji - " + jmeno);
        try {
// zjist� kolik je z�znam� v tabulce = vytvori dalsi unikatni ID slovicka
            ResultSet rs = dbStatement.executeQuery("SELECT * FROM data");
            while (rs.next()) {
                ID_exist = rs.getInt("ID");
                if (ID_exist != ID) {
                    zapis_na_pozici(ID, jmeno, slozka, kategorie, verze, popis, plna, user);
                    return (0);
                }
                ID++;

            }
            System.out.println("Muzu zapsat na " + ID + ". pozici (=ID)");
            zapis_na_pozici(ID, jmeno, slozka, kategorie, verze, popis, plna, user);
        } catch (SQLException ex) {
//            ex.printStackTrace();
            System.out.println("Slovicko se nepodarilo zapsat");
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
            return (-1);
        }
        return (0);
    }

    private static void zapis_na_pozici(int ID, String jmeno, String slozka, String kategorie, int verze, String popis, int plna, String user) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date date = new java.util.Date();
        String datum = new String();
        datum = "" + dateFormat.format(date);
        System.out.println("Date - " + datum);
        try {
            dbStatement.executeUpdate("INSERT INTO data VALUES (" + ID + ",'" + jmeno + "','" + slozka + "','" + kategorie + "'," + verze + ",'" + popis + "'," + plna + ",date(),'"+user+"')");
            System.out.println("Zapsana aplikace: " + jmeno);
        } catch (SQLException ex) {
//            ex.printStackTrace();
            System.out.println("Aplikaci se nepodarilo zapsat\n" + ex);
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + ex);
        }
    }

    private static void vypis_DB() {
    }

    static void vymaz_tabulku(String tabulka) {
        try {
            dbStatement.executeUpdate("DROP TABLE " + tabulka);
            System.out.println("Smazana tabulka pro jazyk: " + tabulka);
        } catch (SQLException e) {
            System.out.println("Nepodarilo se mi smazat tabulku!!");
            JOptionPane.showMessageDialog(null, "Oou, neco se pokazilo - " + e);
        }

    }

    /**
    static void vypis(String jazyk)
    {
    ListDB vypis = new ListDB();
    vypis.setDefaultCloseOperation(2);
    vypis.setVisible(true);
    try
    {
    ResultSet rs = dbStatement.executeQuery("SELECT * FROM " + jazyk);
    vypis.vypis_radek("  ID \t| cz \t| cizi \t| kniha \t| lekce \t| zkouseno \t| dobre");
    while (rs.next())
    {
    int ID = rs.getInt("ID");
    String cz = rs.getString("slovo_cz");
    String cizi = rs.getString("slovo_cizi");
    String kniha = rs.getString("kniha");
    int lekce     = rs.getInt("lekce");
    int zkouseno = rs.getInt("zkouseno");
    int dobre = rs.getInt("dobre");
    System.out.println("" + ID + " " + cz + " " + cizi + " "+ kniha + " " + lekce + " " + zkouseno + " " + dobre + " ");
    vypis.vypis_radek("   " + ID + "\t " + cz + "\t " + cizi + "\t "+ kniha + "\t     " + lekce + "\t     " + zkouseno + "\t     " + dobre);
    }

    }
    catch (SQLException ex)
    {
    System.err.println("Chyba p�i v�pisu!!" + ex);
    }
    }
     **/
    /** Creates a new instance of Database */
    public Database() {
    }
}
